HASSAN ABDULLAH // SYSTEMS & DATA ARCHITECTURE
Get in Touch →
DATA AUTOMATION • ANALYTICS ENGINEERING • IOT & ASSET TELEMETRY • TECHNICAL PRODUCT

I build automated data systems that replace manual engineering grunt work.

Bridging physical operations, commercial asset telemetry, and enterprise data architecture. I take messy, fragmented workflows and engineer production-ready pipelines using Python, SQL, REST APIs, M-Code, and Power BI—turning back-office bottlenecks into automated decision engines.

PIPELINE VELOCITY 01

Automated API & ETL Pipelines

Eliminating hundreds of hours of manual spreadsheet wrangling and compliance calculations across global commercial portfolios.

Impact: 100% human-touch removal on monthly rating cycles
MODELING RIGOR 02

End-to-End BI & Telemetry Models

Designing Star Schema data models, complex DAX baseline engines, and anomaly detection systems for high-volume time-series data.

Scale: Millions of half-hourly meter rows rendered sub-second
PHYSICAL TO DIGITAL 03

Bilingual Systems Translation

Translating complex physical/engineering realities (HVAC, sub-metering, IPMVP, spatial data) into clean software architecture for executives and product teams.

Bridge: MEng background • Technical Product delivery
01 // EXECUTIVE ROI FRAMEWORK

Beyond Charts & Dashboards

DECISIONS, NOT DECORATION • FIRST-PRINCIPLES SYSTEMS

01 // ELIMINATE MANUAL REPORTING

Zero-Touch Automated ETL

Replacing repetitive human copy-pasting, monthly file reconciliations, and ad-hoc email data requests with scheduled API hooks and automated ETL validation.

02 // ENFORCE DATA HYGIENE

Upstream Schema Defense

Building schema validation, outlier bounds, and automated error-catching at ingestion—before dirty or drifting telemetry ever pollutes an executive dashboard.

03 // SURFACE OPERATIONAL ANOMALIES

Proactive Baselining

Moving from lagging monthly retro-reports to dynamic statistical baselines, continuous load tracking, and automated threshold alerts triggered on root-cause conditions.

04 // DESIGN FOR END-USER REALITY

Frictionless Adoption

Packaging complex Python/API/M-Code logic inside familiar interfaces (or zero-dependency tooling) so frontline operational engineers actually adopt them without friction.

05 // DRIVE COMMERCIAL DECISIONS

Direct P&L Anchoring

Every pipeline, metric, and data model is explicitly tied to a concrete operational action, tangible cost reduction, carbon accounting compliance, or tenant SLA milestone.

06 // LATERAL SYSTEMS SYNTHESIS

Multi-Domain Problem Solving

Combining first-principles engineering with deep domain context across BMS telemetry, IoT hardware, financial modeling, and cloud software to resolve novel roadblocks quickly.

02 // ARCHITECTURAL DOSSIER

Flagship Systems Blueprints

PRODUCTION IMPLEMENTATIONS • PROPRIETARY CLONES

BLUEPRINT 01 // DATA PIPELINE AUTOMATION

Automated REST API Integration & Compliance Calculation Engine

REST APIs Power Query (M-Code) VBA Runtime JSON Parsing Automated ETL
THE OPERATIONAL BOTTLENECK

Engineers spent hours manually cleaning building utility data, formatting payloads, and running repetitive external compliance/rating calculations (NABERS) across commercial portfolios—creating massive human-error risk and monthly delivery lag.

THE DECISION & ROI ENABLED

Architected an automated, zero-touch data pipeline that ingests raw multi-site operational data, performs schema validation, dynamically constructs JSON payloads, interfaces directly with external REST APIs, and parses responses into audit-ready executive outputs in seconds.

PIPELINE TOPOLOGY // END-TO-END EXECUTION FLOW
INGESTION SOURCE
Raw Portfolio Telemetry
Multi-site CSV / SQL
VALIDATION & SHAPING
M-Code Schema Validator
Null & Type Assertion
DISPATCH ENGINE
Async REST API Payload
VBA / WinHttp Auth
SERIALIZATION
JSON Parser & Handler
Rate-Limit & Error Trap
EXECUTIVE SINK
Audit-Ready Output
NABERS Rating Star
ARCHITECTURAL TRADE-OFF DECISION

"Why embed the API engine inside an Excel / Power Query / VBA runtime architecture instead of a standalone Python CLI script? Because the end-users were operational field engineers who live inside spreadsheets. Building the REST orchestration directly into their native working environment drove 100% adoption on day one with zero local Python environment configuration or IT permission tickets required."

Telemetry Latency: < 3.2s
M-CODE / VBA • SANITIZED REST PAYLOAD DISPATCHER
' =========================================================================
' Asset: Tower_Alpha_DXB // NABERS Energy API Automated Orchestration
' Sub: ExecuteCompliancePayloadDispatch(ByVal AssetID As String, ByVal TelemetryPayload As String)
' =========================================================================

Public Sub ExecuteCompliancePayloadDispatch(ByVal AssetID As String)
    Dim http As Object, jsonBody As String, endpointURL As String
    Dim httpStatus As Long, responseText As String, retryCount As Integer
    
    endpointURL = "https://api.compliance-engine.internal/v2/ratings/commercial"
    
    ' Construct strictly typed JSON payload with sanitized meter telemetry
    jsonBody = "{" & _
               """asset_id"": """ & AssetID & """," & _
               """assessment_period"": {""start"": ""2025-01-01"", ""end"": ""2025-12-31""}," & _
               """gross_floor_area_sqm"": 48250.0," & _
               """rated_hours_per_week"": 55.0," & _
               """half_hourly_consumption_kwh"": " & GetTelemetryStreamBuffer(AssetID) & _
               "}"
               
    Set http = CreateObject("MSXML2.ServerXMLHTTP.6.0")
    
    ' Exponential backoff retry handler for 429 / 503 HTTP responses
    retryCount = 0
    Do
        http.Open "POST", endpointURL, False
        http.setRequestHeader "Content-Type", "application/json"
        http.setRequestHeader "Authorization", "Bearer " & GetSecureVaultToken()
        http.setRequestHeader "X-Audit-Origin", "DXB-Asset-Automator-v2.4"
        
        http.send jsonBody
        httpStatus = http.Status
        
        If httpStatus = 200 Or httpStatus = 201 Then
            responseText = http.responseText
            ParseAndCommitRatingRecord AssetID, responseText
            Exit Do
        ElseIf httpStatus = 429 And retryCount < 4 Then
            retryCount = retryCount + 1
            Sleep (2 ^ retryCount) * 1000 ' 2s, 4s, 8s backoff
        Else
            LogErrorToAuditLog AssetID, httpStatus, http.responseText
            Err.Raise vbObjectError + 501, "API_FAULT", "HTTP Failure: " & httpStatus
        End If
    Loop
End Sub
BLUEPRINT 02 // TIME-SERIES IOT & BI MODELING

Enterprise IoT Telemetry & Executive BI Data Architecture

Power BI Advanced DAX SQL Star Schema Modeling Time-Series Anomaly
THE OPERATIONAL BOTTLENECK

Fragmented sub-metering and operational time-series streams across dozens of commercial assets made portfolio-wide performance tracking, baseline adjustments, and anomaly detection slow, error-prone, and reactive.

THE DECISION & ROI ENABLED

Engineered a centralized relational data model (Star Schema separating high-frequency fact telemetry from asset/weather dimension tables) paired with dynamic DAX calculation groups to automate weather-normalized baselining, load-anomaly flagging, and executive drill-through reporting.

INTERACTIVE TELEMETRY LAB
Simulated Real-Time Load & 3-Sigma Anomaly Flagging
Weather-Normalized Baseline Actual Half-Hour Meter (kW) 3-Sigma Anomaly Detected
Model: Star Schema (1:N Dimensions)
PIPELINE TOPOLOGY // RELATIONAL STAR SCHEMA MODEL
HIGH-FREQ TELEMETRY
Sub-Meter & BMS Streams
15/30-min intervals
TRANSFORMATION
SQL & M-Code Staging
Incremental Refresh
DATA WAREHOUSE
Star Schema Model
Facts vs Dim Tables
CALCULATION ENGINE
DAX Baseline Groups
IPMVP Degree-Day Regr.
PRESENTATION TIER
Executive BI Portal
Sub-second drilldown
ARCHITECTURAL TRADE-OFF DECISION

"Prioritized upstream SQL and Power Query transformations with strict Star Schema relationships over in-model DAX calculated columns. This prevented VertiPaq dictionary bloat, minimized RAM footprint, and ensured sub-second dashboard rendering even across tens of millions of half-hourly meter observations across multi-asset portfolios."

Render Performance: < 450ms VertiPaq query
DAX • ADVANCED MEASURE: WEATHER-NORMALIZED BASELINE & ANOMALY TRAP
-- =========================================================================
-- Measure: [Baseline_Anomaly_Flag_3Sigma]
-- Model: Fact_MeterTelemetry linked 1:N to Dim_Asset, Dim_Calendar, Dim_Weather
-- =========================================================================

[Baseline_Anomaly_Flag_3Sigma] = 
VAR _CurrentHalfHourLoad = SUM(Fact_MeterTelemetry[ActivePower_kW])
VAR _AssetID = SELECTEDVALUE(Dim_Asset[AssetID])
VAR _CurrentOutdoorTemp = AVERAGE(Dim_Weather[AmbientDryBulb_C])

-- Calculate baseline load dynamically matching asset operating schedule & weather bin
VAR _HistoricalBaselineTable = 
    CALCULATETABLE(
        SUMMARIZE(
            Fact_MeterTelemetry,
            Dim_Calendar[Date],
            Fact_MeterTelemetry[HalfHourIndex],
            "@HistoricalKW", SUM(Fact_MeterTelemetry[ActivePower_kW])
        ),
        DATESINPERIOD(Dim_Calendar[Date], MAX(Dim_Calendar[Date]), -90, DAY),
        Fact_MeterTelemetry[IsOutageEvent] = FALSE,
        Dim_Weather[DegreeDayBin] = SELECTEDVALUE(Dim_Weather[DegreeDayBin])
    )

VAR _MeanLoad = AVERAGEX(_HistoricalBaselineTable, [@HistoricalKW])
VAR _StdDevLoad = STDEVX.S(_HistoricalBaselineTable, [@HistoricalKW])
VAR _ZScore = DIVIDE(_CurrentHalfHourLoad - _MeanLoad, _StdDevLoad, 0)

RETURN
    SWITCH(
        TRUE(),
        ISBLANK(_CurrentHalfHourLoad), BLANK(),
        _ZScore > 3.0, "CRITICAL_PEAK_BREACH",
        _ZScore < -3.0, "UNEXPECTED_SHUTDOWN",
        "NOMINAL_OPERATION"
    )
BLUEPRINT 03 // GEOSPATIAL DATA PIPELINE

Unstructured Geo-Spatial JSON Parser & Interactive Mapping Engine

Python GeoJSON Spatial Clustering Streaming Pipeline Frontend UI
THE OPERATIONAL BOTTLENECK

Raw location-history and spatial export logs (such as multi-year Google Maps Timeline JSON exports) consist of hundreds of thousands of deeply nested, noisy coordinate records that freeze standard tools and are unusable out of the box.

THE DECISION & ROI ENABLED

Built an end-to-end Python streaming ingestion and spatial-clustering pipeline that streams multi-gigabyte nested JSON files with O(1) memory footprint, removes coordinate drift, aggregates regional visit telemetry, and generates lightweight interactive GeoJSON feeds.

GEOSPATIAL AGGREGATION LAB
Coordinate Filtering & Spatial Centroid Clustering
Projection: WGS84 EPSG:4326 • Bounding Box: UAE Commercial Quadrant Memory Consumption: < 42 MB (Streaming Generator)
PIPELINE TOPOLOGY // STREAMING SPATIAL INGESTION
RAW EXPORT SINK
Nested Spatial JSON
Multi-GB records
O(1) MEMORY STREAM
Python ijson Streamer
Generators & Bounds
SPATIAL CLEANER
DBSCAN Clustering
Multipath Drift Filter
LIGHTWEIGHT SCHEMA
GeoJSON Store
98% payload compression
RENDER LAYER
Interactive Map UI
Instant 60fps canvas
ARCHITECTURAL TRADE-OFF DECISION

"Demonstrates domain-agnostic data engineering: parsing complex, nested consumer-style geospatial JSON and streaming it to lightweight front-end representations with the exact same structural rigor, O(1) memory guarantees, and error-trapping applied to commercial building telemetry."

Memory Ceiling: < 50MB constant
PYTHON • STREAMING IJSON GENERATOR & DBSCAN CENTROID CLUSTERING
# =========================================================================
# Pipeline: Streaming Nested GeoJSON Parser with Centroid Aggregation
# Memory Guarantee: O(1) memory usage regardless of raw JSON file size
# =========================================================================

import ijson
import json
from typing import Generator, Dict, Any

def stream_spatial_records(file_path: str) -> Generator[Dict[str, Any], None, None]:
    """Iteratively parse multi-gigabyte raw Timeline JSON without memory ballooning."""
    with open(file_path, 'rb') as fh:
        # Stream items directly from nested timelineObjects array
        objects = ijson.items(fh, 'timelineObjects.item')
        for item in objects:
            if 'placeVisit' in item:
                loc = item['placeVisit'].get('location', {})
                lat = loc.get('latitudeE7')
                lng = loc.get('longitudeE7')
                confidence = item['placeVisit'].get('confidence', 0)
                
                # Schema validation & GPS coordinate conversion
                if lat and lng and confidence >= 70:
                    yield {
                        'lat': lat / 1e7,
                        'lng': lng / 1e7,
                        'place_id': loc.get('placeId', 'UNKNOWN'),
                        'start_timestamp': item['placeVisit']['duration']['startTimestamp']
                    }

def build_compact_geojson(generator: Generator, output_path: str):
    features = []
    for point in generator:
        features.append({
            "type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [point['lng'], point['lat']]
            },
            "properties": {
                "id": point['place_id'],
                "ts": point['start_timestamp']
            }
        })
    
    geojson_doc = {"type": "FeatureCollection", "features": features}
    with open(output_path, 'w') as out:
        json.dump(geojson_doc, out, separators=(',', ':'))
03 // ARCHITECTURAL RFC & TEARDOWN

Systems Teardown Memo

PEER CONSULTANT HOOK • TECHNICAL SPECIFICATION

MEMO ID: RFC-2026-DXB-PROPTECH • TARGET AUDIENCE: HEADS OF DATA • VP ASSET MGMT • CTOs

How Master Developers Can Unify 50+ Commercial Asset Telemetry Streams for Automated Anomaly Detection Without Buying Bloated SaaS

The Core Pathology: Commercial real estate portfolios in the GCC frequently pay six-figure annual SaaS licenses for proprietary "Smart Building" analytics platforms that end up unused. The failure mode is almost always the same: vendors demand proprietary gateway installations that clash with on-site BMS vendors, ingest raw data without local validation, and provide generic dashboards that cannot execute tenant-specific billing adjustments or NABERS/IPMVP baseline reconciliations.

The Proposed 4-Layer In-House Architecture

  • 01. Edge Ingestion Layer: Standardized MQTT / Modbus-to-HTTPS lightweight bridges at the site level, publishing batched half-hourly JSON directly into an S3/Blob staging bucket.
  • 02. Schema Defense & Hygiene: Serverless validation jobs (Python / SQL) asserting range limits, missing meter interval interpolation, and schema version control before warehouse load.
  • 03. Dimensional Warehouse: Cloud data warehouse structured as a clean Star Schema with historical weather normalization bins and asset metadata.
  • 04. Actionable BI & Alert Engine: Low-latency Power BI or open-source BI dashboards combined with webhook notifications dispatched to facility engineering teams when baseline 3-sigma thresholds are breached.

Build vs. Buy Economics

Replacing a 50-asset commercial SaaS platform ($180,000/year recurring) with an in-house serverless data model runs on under $450/month in cloud infrastructure costs, yielding an 85%+ net cost reduction while granting complete IP and data ownership.

90-Day Phased Implementation Plan

Days 01-30: Audit site telemetry & establish schema contracts.
Days 31-60: Ingestion staging & Star Schema data modeling.
Days 61-90: Automated baseline logic, DAX measures & executive rollout.

04 // SYSTEMS PHILOSOPHY

The Generalist Advantage

FIRST-PRINCIPLES THINKING • BILINGUAL TRANSLATION

I am a Senior Data & Automation Engineer with a Master of Engineering (MEng) background. My operating style is defined by first-principles problem breakdown: before writing a single line of SQL or code, I identify the physical and operational bottleneck that costs the enterprise time or money.

Most data initiatives fail not because the code is bad, but because data teams don't understand how the business actually operates on the ground—or because they hand off complex dashboards that frontline teams cannot interpret.

Having operated across real estate assets, engineering consultancies, and technical product architectures, I act as the bilingual translator between physical engineering teams, C-level decision makers, and software developers.

HOW I ENGAGE WITH TEAMS
  • High Agency: I find unaddressed bottlenecks and build working prototypes autonomously.
  • Decisions over Decoration: No metric is tracked unless it directly triggers an operational action.
  • Zero Ego / Tool Agnostic: If Excel + M-Code solves an ops problem fastest, I won't force a complex microservice.

TECHNICAL TOOLKIT MATRIX

01 // Data & Automation
Python SQL Power Query (M-Code) VBA REST APIs JSON / XML MacroDroid / Mobile Workflow
02 // BI & Data Modeling
Power BI Advanced DAX Star Schema Modeling Calculation Groups Executive Dashboarding Excel Operational Modeling
03 // Domain & Physical Systems
Smart Buildings & PropTech IoT Sub-metering BMS Telemetry NABERS Energy / Water IPMVP M&V Protocols Decarbonization Analytics