from http.server import HTTPServer, BaseHTTPRequestHandler import json import sys class SimpleServerHandler(BaseHTTPRequestHandler): def do_POST(self): # Read the content length content_length = int(self.headers.get('Content-Length', 0)) # Read the request body body = self.rfile.read(content_length) try: # Parse JSON data = json.loads(body.decode('utf-8')) # Extract device_id device_id = data.get('device_id', 'unknown') # Create filename filename = f'webserver_shelly_{device_id}.txt' # Write JSON to file (append mode, one per line) with open(filename, 'a') as f: f.write(json.dumps(data) + '\n') # Print to console in key:value format print(f"\n--- Data received from {device_id} ---") self._print_json_flat(data) # Send response self.send_response(200) self.send_header('Content-type', 'application/json') self.end_headers() self.wfile.write(json.dumps({'status': 'ok'}).encode('utf-8')) except Exception as e: print(f"Error processing request: {e}", file=sys.stderr) self.send_response(500) self.end_headers() def _print_json_flat(self, data, prefix=''): """Recursively print JSON data in key:value format""" for key, value in data.items(): full_key = f'{prefix}{key}' if prefix else key if isinstance(value, dict): self._print_json_flat(value, f'{full_key}.') elif isinstance(value, list): for i, item in enumerate(value): if isinstance(item, dict): self._print_json_flat(item, f'{full_key}[{i}].') else: print(f'{full_key}[{i}]: {item}') else: print(f'{full_key}: {value}') def log_message(self, format, *args): """Suppress default HTTP logging""" pass if __name__ == '__main__': server = HTTPServer(('0.0.0.0', 5000), SimpleServerHandler) print('Server listening on port 5000...') print('Press Ctrl+C to stop\n') try: server.serve_forever() except KeyboardInterrupt: print('\nShutting down...') server.shutdown()